From b4a663b87df3954557434a2d31bff7f6b2706ec1 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Tue, 15 May 2007 09:59:51 +0100 Subject: [PATCH] 64-bit hvm on 32-bit dom0 - ioemu adjustments Don't mask off data bits when running 64-bit hvm guests on 32-bit dom0. Signed-off-by: Jan Beulich --- tools/ioemu/target-i386-dm/helper2.c | 33 +++++++++++++--------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/tools/ioemu/target-i386-dm/helper2.c b/tools/ioemu/target-i386-dm/helper2.c index 268bf25f0f..4d43b1802c 100644 --- a/tools/ioemu/target-i386-dm/helper2.c +++ b/tools/ioemu/target-i386-dm/helper2.c @@ -322,7 +322,7 @@ void cpu_ioreq_pio(CPUState *env, ioreq_t *req) do_outp(env, req->addr, req->size, req->data); } else { for (i = 0; i < req->count; i++) { - unsigned long tmp; + unsigned long tmp = 0; read_physical((target_phys_addr_t) req->data + (sign * i * req->size), @@ -354,7 +354,7 @@ void cpu_ioreq_move(CPUState *env, ioreq_t *req) } } } else { - unsigned long tmp; + target_ulong tmp; if (req->dir == IOREQ_READ) { for (i = 0; i < req->count; i++) { @@ -380,14 +380,14 @@ void cpu_ioreq_move(CPUState *env, ioreq_t *req) void cpu_ioreq_and(CPUState *env, ioreq_t *req) { - unsigned long tmp1, tmp2; + target_ulong tmp1, tmp2; if (req->data_is_ptr != 0) hw_error("expected scalar value"); read_physical(req->addr, req->size, &tmp1); if (req->dir == IOREQ_WRITE) { - tmp2 = tmp1 & (unsigned long) req->data; + tmp2 = tmp1 & (target_ulong) req->data; write_physical(req->addr, req->size, &tmp2); } req->data = tmp1; @@ -395,14 +395,14 @@ void cpu_ioreq_and(CPUState *env, ioreq_t *req) void cpu_ioreq_add(CPUState *env, ioreq_t *req) { - unsigned long tmp1, tmp2; + target_ulong tmp1, tmp2; if (req->data_is_ptr != 0) hw_error("expected scalar value"); read_physical(req->addr, req->size, &tmp1); if (req->dir == IOREQ_WRITE) { - tmp2 = tmp1 + (unsigned long) req->data; + tmp2 = tmp1 + (target_ulong) req->data; write_physical(req->addr, req->size, &tmp2); } req->data = tmp1; @@ -410,14 +410,14 @@ void cpu_ioreq_add(CPUState *env, ioreq_t *req) void cpu_ioreq_sub(CPUState *env, ioreq_t *req) { - unsigned long tmp1, tmp2; + target_ulong tmp1, tmp2; if (req->data_is_ptr != 0) hw_error("expected scalar value"); read_physical(req->addr, req->size, &tmp1); if (req->dir == IOREQ_WRITE) { - tmp2 = tmp1 - (unsigned long) req->data; + tmp2 = tmp1 - (target_ulong) req->data; write_physical(req->addr, req->size, &tmp2); } req->data = tmp1; @@ -425,14 +425,14 @@ void cpu_ioreq_sub(CPUState *env, ioreq_t *req) void cpu_ioreq_or(CPUState *env, ioreq_t *req) { - unsigned long tmp1, tmp2; + target_ulong tmp1, tmp2; if (req->data_is_ptr != 0) hw_error("expected scalar value"); read_physical(req->addr, req->size, &tmp1); if (req->dir == IOREQ_WRITE) { - tmp2 = tmp1 | (unsigned long) req->data; + tmp2 = tmp1 | (target_ulong) req->data; write_physical(req->addr, req->size, &tmp2); } req->data = tmp1; @@ -440,14 +440,14 @@ void cpu_ioreq_or(CPUState *env, ioreq_t *req) void cpu_ioreq_xor(CPUState *env, ioreq_t *req) { - unsigned long tmp1, tmp2; + target_ulong tmp1, tmp2; if (req->data_is_ptr != 0) hw_error("expected scalar value"); read_physical(req->addr, req->size, &tmp1); if (req->dir == IOREQ_WRITE) { - tmp2 = tmp1 ^ (unsigned long) req->data; + tmp2 = tmp1 ^ (target_ulong) req->data; write_physical(req->addr, req->size, &tmp2); } req->data = tmp1; @@ -495,12 +495,9 @@ void cpu_ioreq_xchg(CPUState *env, ioreq_t *req) void __handle_ioreq(CPUState *env, ioreq_t *req) { - if (!req->data_is_ptr && (req->dir == IOREQ_WRITE)) { - /* Clamp data operand to size of a long. */ - if (req->size < sizeof(long)) - req->data &= (1UL << (8 * req->size)) - 1; - req->data = (unsigned long)req->data; - } + if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) && + (req->size < sizeof(target_ulong))) + req->data &= ((target_ulong)1 << (8 * req->size)) - 1; switch (req->type) { case IOREQ_TYPE_PIO: -- 2.30.2